sciencewikiaorg_ru-20200216-history
Модуль:Ru
locative|Москва}} → в Москве в → в Казани Существует, однако, большая группа существительных, для которых формы предложного и местного падежей не совпадают (например: «лес» → «о ле́се», но «в лесу́»). Данная функция не учитывает эти исключения — не используйте её в подобных случаях! о → о лесе pl Формирует множественное число (название функции — от англ. plural): → шахтёры → травы → кони Данная функция определяет склонение слова с помощью функции guessdecl. При необходимости (напр., когда guessdecl ошибается), склонение можно указать в явном виде во втором аргументе: → пальто (без второго аргумента: → ошибочно «пальта») guessdecl Угадывает тип склонения (название функции — от англ. guess declension). Данная функция используется функцией locative, если при вызове последней не задан второй параметр. Возвращаемые значения: 0 — для несклоняемых существительных; 1, 2 и 3 — для существительных I, II и III склонения, соответственно; a (от англ. adjective) — для прилагательных. Важно: невозможно без использования словаря различать следующие случаи: слова III склонения (напр., «дверь») и оканчивающиеся на «ь» слова II склонения (напр., «конь»). Данная функция возвращает для таких слов значение 2. Значение 3 возвращается только для слов, оканчивающихся на «Xмя», где X — гласная (напр., «время»); в действительности, эти слова являются разносклоняемыми (см. статью Склонение) и склоняются по третьему склонению не во всех формах: исключение — форма творительного падежа единственного числа. несклоняемые слова, форма которых совпадает с формой какого-либо склонения (напр., «пальто» / «озеро»). Для таких слов будет возвращаться неправильное значение 1, 2 или 3 вместо правильного 0. Примеры: → 0 → 1 → 2 → 3 → a Примеры ошибок: → 2 (должно быть 3) → 2 (должно быть 0) o (латиницей) Подбирает предлог о/об/обо: → о → об → обо obo Используется функцией o, для экспорта в другие скрипты, в invoke не работает. require("Module:Ru").obo("слово") -- Основные функции, касающиеся русского языка -- Основные функции, касающиеся русского языка local M={} function M.o(f) return M.obo(f.args1) end function M.obo(phr) -- выбирает предлог о, об или обо к фразе, в начале кот. м. б. пунктуация local w = mw.ustring.match(phr,"%p%s%c*(.-)%p%s%c") or mw.ustring.match(phr,"%p%s%c*(.-)$") if not w then return nil end if string.find(" всей всём всех мне ",' '..mw.ustring.lower(w)..' ',1,true) then return 'обо' end local ws=mw.ustring.sub(w,1,2) if ws mw.ustring.upper(ws) then -- abbrev if mw.ustring.match(ws,"^ЙУНФЫАРОЛЭСМИRYUIOASFHLXNMÖÜÄΑΕΟΥΩ") then return 'об' else return 'о' end elseif mw.ustring.match(mw.ustring.upper(w),"^АОЭИУЫAOIEÖÜÄΑΕΟΥΩ") then return 'об' else return 'о' end end local cons='бвгджзйклмнпрстфхцчшщ'; -- all consonants local cons7='кгхчжшщ'; -- consonants requiring -и local adjends={'ой'='ые','ый'='ые','ий'='ие','ое'='ые','ая'='ые','яя'='ие','ое'='ые','ее'='ие'}; local specpl={ 'город'='города', 'болгарин'='болгары', 'боярин'='бояре', 'брат'='братья', 'век'='века', 'веко'='веки', 'вес'='веса', 'грузин'='грузины', 'день'='дни', 'дерево'='деревья', 'директор'='директора', 'дитя'='дети', 'доктор'='доктора', 'дочь'='дочери', 'друг'='друзья', 'звезда'='звёзды', 'знамя'='знамёна', 'инспектор'='инспектора', 'край' = 'края', 'мать'='матери', 'небо'='небеса', 'озеро'='озёра', 'перо'='перья', 'поезд'='поезда', 'ребёнок'='дети', 'список'='списки', 'сын'='сыновья', 'татарин'='татары', 'церковь'='церкви', 'цыган'='цыгане', 'человек'='люди', 'чудо'='чудеса' }; -- table of some common special plural cases function M.pl(p) -- множественное число, 2-й аргумент 0 (нескл.), 1, 2, 3 или a (adjective - прилагательное) --Поддержка словосочетаний планируется потом local word = p.args1; if specplword then return specplword end; local d=p.args2; if d nil then d=M.guessdecl(p) end; if d '0' then return word elseif d 'a' then if mw.ustring.match(word,''..cons7..'..$') then return mw.ustring.sub(word,1,-3)..'ие' else return mw.ustring.sub(word,1,-3)..adjendsmw.ustring.sub(word,-2) end elseif d '1' then if mw.ustring.sub(word,-1) 'я' or mw.ustring.match(word,''..cons7..'а$') then return mw.ustring.sub(word,1,-2)..'и' else return mw.ustring.sub(word,1,-2)..'ы' end elseif d '2' then if mw.ustring.match(word,'о$') then return mw.ustring.sub(word,1,-2)..'а' elseif mw.ustring.match(word,'е$') then return mw.ustring.sub(word,1,-2)..'я' elseif mw.ustring.match(word,'ьй$') then return mw.ustring.sub(word,1,-2)..'и' elseif mw.ustring.match(word,'онок$') then return mw.ustring.sub(word,1,-5)..'ата' elseif mw.ustring.match(word,'ёнок$') then return mw.ustring.sub(word,1,-5)..'ята' elseif mw.ustring.match(word,'анин$') then return mw.ustring.sub(word,1,-5)..'ане' elseif mw.ustring.match(word,'янин$') then return mw.ustring.sub(word,1,-5)..'яне' elseif mw.ustring.match(word,'ец$') and not mw.ustring.match(word,''..cons7..''..cons7..'ец$') then -- !!неправильно для этнохоронимов на -ец типа "ньюйоркцы" if mw.ustring.match(word,'лец$') then return mw.ustring.sub(word,1,-3)..'ьцы' elseif mw.ustring.match(word,'аоуыэяёюиеец$') then return mw.ustring.sub(word,1,-3)..'ьцы' else return mw.ustring.sub(word,1,-3)..'цы' end elseif mw.ustring.match(word,''..cons7..'$') then return word..'и' else return word..'ы' end elseif d '3' then if mw.ustring.match(word,'мя$') then return mw.ustring.sub(word,1,-3)..'ена' else return mw.ustring.sub(word,1,-2)..'и' end else return "Wrong declesion '"..d.."' in RuGrammar::pl()" end end function M.guessdecl(p) -- угадывает тип склонения local word=p.args1; if mw.ustring.match(word,''..cons..'оыий$') or mw.ustring.match(word,''..cons..'аяя$') or mw.ustring.match(word,''..cons..'оее$') then return 'a' --sometimes wrong elseif mw.ustring.match(word,''..cons..'оеь?$') then return '2' --but mb 3, can't guess w/o dict elseif mw.ustring.match(word,''..cons..'ая$') then if mw.ustring.match(word,'^'..cons..'мя$') then return '3' else return '1' end else return '0' end end function M.locative(p) -- Возможно, будет когда-то заменено на функционал mw.language('ru'):grammar(), которого пока не хватает local word=p.args1; local locend={'а'='е', 'я'='е', 'й'='е', 'ы'="ах", 'ь'='и'}; --the last one is disputed: most Russian cities ending with -ь are 3rd declesion, but some foreign ones are 2nd decl., so -е should be returned local ec=mw.ustring.sub(word,-1); if mw.ustring.match(word,'ия$') then return mw.ustring.sub(word,1,-2)..'и' elseif mw.ustring.match(word,''..cons..'ль$') or mw.ustring.sub(word,-4) 'поль' then return mw.ustring.sub(word,1,-2)..'е' elseif locendec then return mw.ustring.sub(word,1,-2)..locendec elseif ec 'я' then return mw.ustring.sub(word,1,-2)..'е' elseif mw.ustring.match(ec,''..cons..'') then return word..'е' elseif ec 'о' then if mw.ustring.match(word,'оеёво$') then return mw.ustring.sub(word,1,-2)..'е' else return word end else return word end end; return M